//闭包
// 特殊的地方
function foo () {
  var myName = '极客时间'
  let test1 = 1
  const test2 = 2
  var innerBar = {  //var函数不支持块级作用域，所以test1不会被innerBar访问到
    getName: function () {                          
        console.log(test1)// outer指向foo函数  1
      return myName
    },
    setName: function (newName) {
      myName = newName  //myName指向foo函数的myName(极客时间)，但被newName赋值为极客邦
    }
  }
  // return 可以被外部访问
  return innerBar // 闭包形成的条件-函数嵌套函数
}

var bar = foo() // foo出栈  innerBar对象被bar指向  闭包形成
bar.setName('极客邦') //bar.setName调用时，会修改foo函数的myName为极客邦
bar.getName() 
console.log(bar.getName()) 
